package com.qingcheng.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.qingcheng.pojo.goods.Goods;
import com.qingcheng.pojo.goods.Sku;
import com.qingcheng.pojo.goods.Spu;
import com.qingcheng.service.goods.CategoryService;
import com.qingcheng.service.goods.SpuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/item")
public class ItemController {

    @Reference
    private SpuService spuService;

    @Value("${pagePath}")
    private String pagePath;//引入创建文件的地址

    @Autowired
    private TemplateEngine templateEngine;//引入thymeleaf的创建页面

    @Reference
    private CategoryService categoryService;//引入categoryService接口类


    @GetMapping("/createPage")
    public void createPage(String spuId){
        //1.查询商品的信息
        Goods goods = spuService.findGoodsById(spuId);
        //根据获取商品信息获取spu的商品信息
        Spu spu = goods.getSpu();
        //根据获取的商品的信息获取sku的列表
        List<Sku> skuList = goods.getSkuList();
        /**
         * 商品分类
         * 先创建list的集合，再利用spu中的
         * category1Id
         * category2Id
         * category3Id
         * 来查出商品的一级，二级，三级分类
         */
        ArrayList<String> categoryList = new ArrayList<>();
        categoryList.add(categoryService.findById(spu.getCategory1Id()).getName());//存入一级分类
        categoryList.add(categoryService.findById(spu.getCategory2Id()).getName());//存入二级分类
        categoryList.add(categoryService.findById(spu.getCategory3Id()).getName());//存入三级分类
        //url
        Map urlMap = new HashMap();
        for (Sku sku : skuList) {
            String specJson = JSON.toJSONString(JSON.parseObject(sku.getSpec()), SerializerFeature.MapSortField);
            urlMap.put(specJson,sku.getId()+".html");
        }
        //生成sku的页面
        for (Sku sku : skuList) {
            //创建上下文和数据模型，为生成页面做准备.
            Context context = new Context();
            //创建一个map集合用来存放查询的数据，展示到页面的数据
            Map<String, Object> dataModel = new HashMap<>();
            //把spu存入dataModel集合中
            dataModel.put("spu",spu);
            //把spu存入dataModel集合中
            dataModel.put("sku",sku);
            //把分类也存入数据模型中
            dataModel.put("categoryList",categoryList);

            //商品详细页的图片列表为SKU的图片列表+SPU的图片列表
            dataModel.put("skuImages",sku.getImages().split(","));
            dataModel.put("spuImages",spu.getImages().split(","));

            //商品的显示规格和参数列表
            Map paraItems = JSON.parseObject(spu.getParaItems());
            dataModel.put("paraItems",paraItems);
            //参数列表
            Map<String,String> specItems = (Map) JSON.parseObject(sku.getSpec());
            dataModel.put("specItems",specItems);
            //url


            //规格面板
            Map<String,List> specMap = (Map) JSON.parseObject(spu.getSpecItems());//规格和规格选项
            for (String key : specMap.keySet()) {//循环规格
                List<String> list = specMap.get(key);////["天空之境","珠光贝母"]
                List<Map> mapList = new ArrayList<>();//新的集合  //[{ 'option':'天空之境',checked:true },{ 'option':'珠光贝母',checked:false }]

                for (String value : list) {//循环规格选项
                    Map map = new HashMap();
                    map.put("option",value);//以key和value的形式拼接成{'option':'天空之境'}
                    if (specItems.get(key).equals(value)){//如果表sku的规格相同就选中
                        map.put("checked",true);
                    }else {
                        map.put("checked",false);
                    }
                    Map<String,String>spec = (Map)JSON.parseObject(sku.getSpec());
                    spec.put(key,value);
                    //url
                    String specJson = JSON.toJSONString(spec, SerializerFeature.MapSortField);
                    map.put("url",urlMap.get(specJson));
                    mapList.add(map);

                }
                specMap.put(key,mapList);
            }
            dataModel.put("specMap",specMap);


            //利用上下文的context来存放map集合
            context.setVariables(dataModel);
            //创建文件（准备文件）(file的文件的地址为resources的文件中)
            File dir = new File(pagePath);
            //判断文件dir是否存在不存在就创建
            if (!dir.exists()){
                dir.mkdir();
            }
            //利用sku的id创建html页面（如100000003145.html）
            File dest = new File(dir, sku.getId() + ".html");

            try {
                //生成页面
                PrintWriter writer = new PrintWriter(dest, "UTF-8");
                //创建页面
                templateEngine.process("item",context,writer);
                //控制台输出页面的名称
                System.out.println("生成的页面："+sku.getId()+".html");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }


    }



}